#ifndef VAR_H
#define VAR_H 1

#include "main.h"
#include "array.h"
#include "string.h"
#include "dict.h"
#include "hashmap.h"
#include "request.h"
#include "tag.h"

typedef struct array var_arr_t;
typedef struct tag_data tagdt_t;

typedef struct __ncattr__ var_reqdata {
  const struct request *req;
  const struct parse_data *pd;
  string_t *result;
  dict_t *attrs;
  map_t *qry;
  void **unused;
} var_reqdata_t;

typedef int (*v_cb)(void);
typedef void (*vfound_cb)(const tagdt_t *);
typedef void (*vrequest_cb)(const struct var_reqdata *);

typedef struct __ncattr__ var_cb {
  const v_cb preinit_cb;
  const v_cb shutdown_cb;
  const v_cb init_cb;
  const v_cb free_cb;
  const vfound_cb found_cb;
  const vrequest_cb request_cb;
} var_cb_t;

#define VAR_NAME "var"
#define VAR_DEFAULT	VAR_SIMPLE|VAR_TMPLT_NONE
#define VAR_SIMPLE	0
#define VAR_EXTENDED	1
#define VAR_CONFIG	2
#define VAR_TMPLT_REQ	4
#define VAR_TMPLT_NONE	8

typedef struct var {
  const char *vname;
  const char **var_args;
  const var_cb_t vcbs;
  const uint8_t vflags;
} var_t;

#include "builtin/builtins.h"

void
init_var(void);

void
free_var(void);

void
register_var(const var_t *vt);

void
check_var_pdata(const pdata_arr_t *pd_arr);

void
call_vpreinit_cbs(void);

void
call_vshutdown_cbs(void);

void
call_vinit_cbs(void);

void
call_vfree_cbs(void);

#endif
